package com.ljf.mvcssh.dao;

import java.util.List;

import com.ljf.mvcssh.util.Page;
/*
 * 公共的dao层接口
 * @author 林景锋
 * @date 2017年10月2日
 * @param <T>	实体
 */
public interface BaseDao<T> {

	void save(T t);

	void delete(int id);

	void update(T t);

	T load(int id);

	//当确定返回的实例只有一个或者null时 用uniqueResult()方法
	T getUniqueResult(String hql,Object... args);
	/*
	 * 使用方法
	 * public void testGet(){  
        Configuration config = new Configuration().configure();  
        SessionFactory factory = config.buildSessionFactory();  
        Session session = factory.openSession();  
        session.beginTransaction();  

        Query query = session.createQuery("from Student s where s.id=?");  
        query.setString(0, "2");  
        Student student = (Student)query.uniqueResult();  //当确定返回的实例只有一个或者null时 用uniqueResult()方法   
        //Student student = (Student)session.createQuery("from Student s where s.id=?").setString(0,"5").uniqueResult();   

        System.out.println(student.getName());  
        System.out.println(student.getBirthday());  


        session.getTransaction().commit();  
        session.close();  
    }  
	 */

	List<T> list(String hql, Object...args);//如果查询返回多个值用list()方法
	/*
	 * public void testQuery(){  
        Configuration config = new Configuration().configure();  
        SessionFactory factory = config.buildSessionFactory(); //创建SessionFactory   
        Session session = factory.openSession();        //创建Session   
        session.beginTransaction();                     //开始事务   

        Query query = session.createQuery("from Student");  
        List list = query.list();  // 用list方法返回多个值   
        //List list = session.createQuery("from Student").list();   
        for(int i=0;i<list.size();i++){  
            Student student = (Student)list.get(i);  
            System.out.print(student.getId()+" ");  
            System.out.print(student.getName()+" ");  
            System.out.print(student.getSex()+" ");  
            System.out.print(student.getBirthday());  
            System.out.println();  
        }         

        session.getTransaction().commit();         //提交事务    
        session.close();                           //关闭Session   
    }
	 */

	List<T> getAllFromTable();	// 获取单张表的所有数据

	boolean findForPage(Page<T> page);	// 分页查询

	// 通过条件进行分页查询
	boolean findPageByCondition(Page<T> page,String condition);

	void batchDelete(final List<Integer> ids);// 批量删除

	void saveOrUpdate(T t);

	/*
	 * save（）方法很显然是执行保存操作的，如果是对一个新的刚new出来的对象进行保存，自然要使用这个方法了，数据库中没有这个对象。
       update（）如果是对一个已经存在的托管对象进行更新那么肯定是要使用update（）方法了，数据中有这个对象。
       saveOrUpdate（）这个方法是更新或者插入，有主键就执行更新，如果没有主键就执行插入。
	 */
}
